10分で作成できる AWS ParallelCluster の実行環境 AWS CloudShell 編
いつもとは違う AWS アカウント上に AWS ParallelCluster のデモや、動作検証のために実行環境を用意する必要がありました。最速で実行環境を用意できるのは CloudShell だろうと思い作成してみたので作成方法をご紹介します。
AWS CloudShell について
AWS ParallelCluster の実行環境として利用する場合の必要事項です。
- CloudShell を起動したユーザーの権限に AWS ParallelCluster で必要な権限があること
- 必要な権限は以下を参照ください
- Base user policy required to invoke AWS ParallelCluster features
- 120日間 CloudShell へアクセスがないと作成した実行環境が削除されること
CloudShell については以下のリンクから詳細をご参照ください。
AWS ParallelCluster の実行環境作成
今回の AWS ParallelCluster の実行環境とは、クラスターを管理するための pcluster
コマンドを利用可能な環境を作成することを目的とします。
以下のドキュメントを参考に実行環境を作成します。
Install AWS ParallelCluster in a virtual environment (recommended) - AWS ParallelCluster
ParallelCluster コマンドのインストール
ParallelCluster のコマンドは pip3 install
で簡単に導入できます。CloudShell はデフォルトで Python3 がインストール済みです。ParallelCluster では Python3.6 以上のバージョンであれば良いため条件を満たしています。
$ python3 -V Python 3.7.10
仮想環境を利用することが推奨されていますので分けておきます。ParallelCluster のバージョンを識別できるよう314
と振りました。最新バージョンはRelease Noteを確認しないとわかりません。
$ python3 -m venv pcluster314 $ source pcluster314/bin/activate
ParallelCluster の管理コマンドをインストールします。
$ pip3 install aws-parallelcluster
$ pcluster version { "version": "3.1.4" }
ParallelCluster の管理コマンドの準備完了です。
Node.js のインストール
pcluster
コマンドからクラスターを生み出すために Node.js の AWS CDK が利用されています。CDK 実行のための環境を準備します。
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash $ chmod ug+x ~/.nvm/nvm.sh $ source ~/.nvm/nvm.sh $ nvm install --lts $ node --version v16.15.1
2023/6/22追記Nod v18 をインストールすると下記のエラーが出力されます。
$ node --version node: /lib64/libm.so.6: version `GLIBC_2.27' not found (required by node) node: /lib64/libc.so.6: version `GLIBC_2.28' not found (required by node)
そのため、明示的に Node v16(Gallium
)を指定してインストールしてください。
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.38.0/install.sh | bash chmod ug+x ~/.nvm/nvm.sh source ~/.nvm/nvm.sh nvm install -lts=Gallium
ParallelCluster の管理コマンドと、CDK の実行が可能になり、AWS ParallelCluster の実行環境が整いました。
クラスター作成テスト
pcluster
コマンドおよび、CDK が正常に動作するかテストのためクラスターを作成します。
クラスター作成の前提
- クラスター(EC2)が起動する VPC、サブネットがあること
クラスターのコンフィグファイル
デモで作成したクラスターのサンプルコンフィグファイルです。環境依存のパラメーターは適時変更してください。
- ヘッドノードのセクション(
HeadNode
)- SubnetId:
subnet-035be95eeaa091603
- KeyName:
sandbox-key
- SubnetId:
- コンピュートノードのセクション(
SlurmQueues
)subnet-035be95eeaa091603
コンピュートノードはスポットインスタンスで起動指定してあります。スポット起動に必要なサービスリンクロールが存在していない場合は以下のドキュメントを参照し作成してください。
Amazon EC2 spot fleet role - AWS Batch
Region: ap-northeast-1 Image: Os: ubuntu2004 Monitoring: Logs: CloudWatch: Enabled: true RetentionInDays: 30 DeletionPolicy: "Delete" Dashboards: CloudWatch: Enabled: false Tags: - Key: Name Value: DemoCluster HeadNode: InstanceType: t3.micro Networking: ElasticIp: false SubnetId: subnet-035be95eeaa091603 Ssh: KeyName: sandbox-key LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore Scheduling: Scheduler: slurm SlurmSettings: ScaledownIdletime: 5 SlurmQueues: # --- 1 --- - Name: debug ComputeResources: - Name: debug InstanceType: t3.micro MinCount: 0 MaxCount: 10 DisableSimultaneousMultithreading: false ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-035be95eeaa091603 PlacementGroup: Enabled: false Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore # --- 2 --- - Name: large ComputeResources: - Name: large InstanceType: c6i.large MinCount: 0 MaxCount: 10 DisableSimultaneousMultithreading: true ComputeSettings: LocalStorage: RootVolume: Size: 35 Encrypted: false VolumeType: gp3 Iops: 3000 Throughput: 125 CapacityType: SPOT Networking: SubnetIds: - subnet-035be95eeaa091603 PlacementGroup: Enabled: true Iam: AdditionalIamPolicies: - Policy: arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
クラスター作成
ClouShell にコンフィグをペーストで上手く貼り付けられませんでした。CloudShell のアクションからファイルをアップロードしました。
コンフィグファイルを引数にクラスターを作成します。
$ pcluster create-cluster --cluster-name DemoCluster --cluster-configuration demo-cluster.yaml
クラスター作成には10分程度時間がかかります。CloudShell は20分放置でセッションが切断されますが、クラスター作成処理は非同期実行されているため仮にセッション切断されても影響はありません。
{ "cluster": { "clusterName": "DemoCluster", "cloudformationStackStatus": "CREATE_IN_PROGRESS", "cloudformationStackArn": "arn:aws:cloudformation:ap-northeast-1:123456789012:stack/DemoCluster/e5f81480-e932-11ec-8cbd-0a5f98338a5d", "region": "ap-northeast-1", "version": "3.1.4", "clusterStatus": "CREATE_IN_PROGRESS" } }
クラスター構築が終わるかクラスターのステータスを確認して待ちます。
CLUSTER_NAME=DemoCluster while true; do pcluster describe-cluster --cluster-name ${CLUSTER_NAME} | jq -r .clusterStatus; sleep 5; done
CREATE_COMPLETE
の表示を確認できればクラスター作成完了です。
CREATE_IN_PROGRESS CREATE_IN_PROGRESS CREATE_COMPLETE
EC2 のダッシュボードを確認するとヘッドノードの起動を確認できました。
以上で、CloudShell からクラスター作成ができることを確認しました。
おわりに
クレデンシャルのことを考えると CloudShell が最もお手軽な実行環境なのではないかと思いました。常用する場合は EC2、Cloud9や、ローカルPC など他の実行環境を検討してください。気づいたら実行環境ごとクラスターのコンフィグが消失していた!ということがないようにお気をつけください。
2023/6/22追記ローカルマシン上のコンテナで pcluster コマンドを管理する方法もございます。